package sockslib.common;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * The class <code>SSLConfigurationBuilder</code> is a builder to build {@link SSLConfiguration}
 *
 * @author Youchao Feng
 * @version 1.0
 * @date Oct 10,2015 11:13 AM
 */
public class SSLConfigurationBuilder {

  private String keyStorePath;
  private String keyStorePassword;
  private String trustKeyStorePath;
  private String trustKeyStorePassword;
  private boolean clientAuth = false;
  private String keyStoreType = "JKS";
  private String trustKeyStoreType = "JKS";

  private SSLConfigurationBuilder() {
  }

  public static SSLConfigurationBuilder newBuilder() {
    return new SSLConfigurationBuilder();
  }

  public SSLConfigurationBuilder setKeyStorePath(String keyStorePath) {
    this.keyStorePath = checkNotNull(keyStorePath);
    return this;
  }

  public SSLConfigurationBuilder setKeyStorePassword(String keyStorePassword) {
    this.keyStorePassword = checkNotNull(keyStorePassword);
    return this;
  }

  public SSLConfigurationBuilder setTrustKeyStorePath(String trustKeyStorePath) {
    this.trustKeyStorePath = checkNotNull(trustKeyStorePath);
    return this;
  }

  public SSLConfigurationBuilder setTrustKeyStorePassword(String trustKeyStorePassword) {
    this.trustKeyStorePassword = checkNotNull(trustKeyStorePassword);
    return this;
  }

  public void setClientAuth(boolean clientAuth) {
    this.clientAuth = clientAuth;
  }

  public SSLConfigurationBuilder setKeyStoreType(String keyStoreType) {
    this.keyStoreType = checkNotNull(keyStoreType);
    return this;
  }

  public SSLConfigurationBuilder useKeystoreAsTrustKeyStore() {
    this.trustKeyStorePath = keyStorePath;
    this.trustKeyStorePassword = keyStorePassword;
    this.trustKeyStoreType = keyStoreType;
    return this;
  }

  public SSLConfigurationBuilder useTrustKeyStoreAsKeyStore() {
    this.keyStorePath = trustKeyStorePath;
    this.keyStorePassword = trustKeyStorePassword;
    this.keyStoreType = trustKeyStoreType;
    return this;
  }

  public SSLConfigurationBuilder setTrustKeyStoreType(String trustKeyStoreType) {
    this.trustKeyStoreType = checkNotNull(trustKeyStoreType);
    return this;
  }

  public SSLConfiguration build() {
    KeyStoreInfo keyStore = null;
    if (keyStorePath != null) {
      keyStore = new KeyStoreInfo(keyStorePath, keyStorePassword, keyStoreType);
    }
    KeyStoreInfo trustKeyStore = null;
    if (trustKeyStorePath != null) {
      trustKeyStore = new KeyStoreInfo(trustKeyStorePath, trustKeyStorePassword, trustKeyStoreType);
    }
    return new SSLConfiguration(keyStore, trustKeyStore, clientAuth);
  }
}
